/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Front.Presentador;

import ObjetoDominio.Archivo;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JTable;


/**
 *Clase que se encarga de refrescar los componentes
 * que visualiza el estado de la descarga
 * @author guzmle
 */
public class HiloStatusDescarga  extends Thread{
    
    private JProgressBar _barra;
    private Archivo _archivo;
    private Object[] _lista;
    private JTable _tabla;
    private JLabel _descargado;
    private JLabel _estado;
     
    /**
     * Constructor de la clase
     * @param barraProgreso objeto de la interfaz que refleja el progreso de la 
     * descarga
     * @param archivo objeto archivo el cual es descargado 
     */
    public HiloStatusDescarga(JTable tabla, JProgressBar barraProgreso, 
            Archivo archivo, JLabel descargado, JLabel estado){
        _archivo = archivo;
        _barra = barraProgreso;
        _barra.setMinimum(0);
        _barra.setMaximum(safeLongToInt(_archivo.getTamaño()));
        _barra.setValue(safeLongToInt(_archivo.getDescargado()));
        _barra.setStringPainted(true);
        _tabla = tabla;
        _descargado = descargado;
        _estado = estado;
    }
    
    @Override
    public void run(){
        while(true){
            if(_archivo.getTamaño() > _archivo.getDescargado()){
            _barra.setValue(safeLongToInt(_archivo.getDescargado()));
            _descargado.setText(FormatoBytes(_archivo.getDescargado()) + " / " +
                       FormatoBytes(_archivo.getTamaño()));
            _tabla.repaint();
            }
            else{
                _barra.setValue(safeLongToInt(_archivo.getTamaño()));
                _descargado.setText(FormatoBytes(_archivo.getTamaño()) + " / " +
                       FormatoBytes(_archivo.getTamaño()));
                if(_archivo.isCargando())
                    _estado.setText("Finalizado Carga");
                else
                    _estado.setText("Finalizado Descarga");
                break;
            }
        }
    }
    
    /**
     * Metodo que da formato en kb a numeros en bytes
     * @param tamaño
     * @return 
     */
    public String FormatoBytes(long tamaño){
        float numero = ((float)tamaño / 1024);
        numero = numero * 100;
        numero = Math.round(numero);         
        return String.valueOf(numero/100) + " Kb";
    }
    
    /**
     * Metodo que realiza un cast de int a long de forma segura
     * @param l
     * @return 
     */
    public static int safeLongToInt(long l) {
        if (l < Integer.MIN_VALUE || l > Integer.MAX_VALUE) {
            throw new IllegalArgumentException
                (l + " cannot be cast to int without changing its value.");
        }
        return (int) l;
    }
    
    public void pause(){
        _estado.setText("Pausado");  
        _tabla.repaint();
        this.suspend();      
    }
    
    public void reanudar(){
        if(_archivo.isCargando())
            _estado.setText("Cargando");
        else
            _estado.setText("Descargando");
        _tabla.repaint();
        this.resume();
    }
    
    public void detener(){
        _estado.setText("Detinido");
        _tabla.repaint();
        this.destroy();
    }
}
